<!--slrpsoup.htm-->
<HTML><HEAD>
<!--<BASE HREF="http://members.bellatlantic.net/~sweyer/newton/sloup/slrpsoup.htm">-->
<TITLE>Applications, Soups</TITLE>
<META NAME="ISBN" CONTENT="slrpsoup.htm">
<META NAME="SHORTTITLE" CONTENT="SloupSoup">
<META NAME="AUTHOR" CONTENT="Steve Weyer">
<META NAME="COPYRIGHT" CONTENT="&copy; 1993-98, S. Weyer">
<META NAME="package.labels" CONTENT="'Books">
<META NAME="data.clickAddFile" CONTENT="func(x,y,href,obj)
begin
	PlaySound(@51); /*ROM_click*/
	GetRoot().|Sloup:TKnollSys|:?addFile(
		&quot;text/html&quot;, href, obj.item.data, nil);
end
">
<META NAME="data.names1.slp" CONTENT="clickAddFile">
<META NAME="data.names2.slp" CONTENT="clickAddFile">
<META NAME="data.calendr1.slp" CONTENT="clickAddFile">
<META NAME="data.todo1.slp" CONTENT="clickAddFile">
</HEAD><BODY>

<H1><A NAME="Keyboard, Print: Sloup Inspector">
Keyboard, Print: Sloup Inspector
</A></H1>
<P>Although this was added primarily to support Newt development, you can
also use it just for keyboard entry to any text field. When you check
Inspect?, the Sloup view shrinks to a smaller size (and leaves the
connection open (if already open). When connected, keyboard input (&amp;
desktop Paste) will be directed to the current Newton "key view". If Newt is
installed (its icon will be visible below Inspect?), the output from the
global Print function, Newt's :print method, GetRoot's :Notify method, and
Newt's :notify &amp; :error methods will be directed to the terminal
emulator while Sloup is connected (in both Inspect and regular transfer
modes).

<P>Tap the Paste button to send the current highlighted selection or entire
field to the desktop.

<P>For keyboard entry, just tap in a field on the Newton and start to type.
Different terminal emulator programs may map characters differently, but the
basic alphanumerics and punctuation keystrokes should work fine (check your
configuration settings). On the Macintosh (at least), the left and right
arrow keys should work. Backspace seems to work, though it doesn't erase the
first character in Notepad. If you are connected and a view is selected, you
should hear a keyclick sound.

<P>Pasting large strings can be inefficient/slow since it posts/pastes a
single character at a time. However, if you're in Inspect mode, in a
"regular" input field/paragraph (not the Notepad), have a range selected or
an empty field, and then enter a series of complete lines (usually via a
Paste from the desktop or a Send Text File), text will appear 3-6x faster
than before. This bypasses the usual entry mechanism which uses
P-o-s-t-K-e-y-S-t-r-i-n-g. As it inserts lines, Sloup keeps an extra last
space highlighted for the next line. When you type single characters or
partial lines (no Return), this uses the usual PostKeyString method (and
eliminates any selected range). This particular trade-off (kludge) allows
much faster input, while still allowing special keystrokes like backspace/
delete, arrow keys, etc. to work.

<H1><A NAME="Newt using Sloup">Newt using Sloup</A></H1>

<P>Here is a potential scenario for how to make effective use of Sloup for
developing and testing <A HREF="../newtdev.htm">Newt</A>-based applications.
(I've used it for Newt's many application examples, plus associated bitmap,
sound and IR resources). Because of coordination between Sloup and Newt,
you should obtain the latest version of each.

<P>On the desktop, prepare application and resource files using a simple
text editor, e.g., BBEdit Lite on Mac; Notepad on Windows.

<P>Start Sloup. You can do this by tapping the Sloup icon in Extras, or
from Newt, select Sloup from Newt's overview list.

<P>Transfer any .bit, .snd, .cmd resources with Sloup. Check bitmaps and
sounds using bitsound.nwt (example utility); if any are wrong, remove
manually with bitsound (or other soup utility like StewPot); or make sure
your resource file uses REPLACE!name. Re-transfer.

<P>For the program source (.nwt) file, check/pick a folder for development.
Add an ERASE! command so that everything will be removed before new entries
are added, or REPLACE!title. Otherwise, you may clutter up your Newton with
duplicate entries, though Newt will warn about these while using the most
recent. To speed up transfer (and minimize storage), you may want to remove
"readme comments" in your copy of original source.

<PRE>Notes
{labels: 'Test, viewFont: 10241}
ERASE!
....
BYE!
</PRE>

<P>Transfer the .nwt file using Sloup. Alternatively, if you have a
relatively static source file, you can convert the .nwt file into a
Paperback application, and download this as a package; then Select it as a
Library and Copy All into a folder (this can be a convenient way to manage
multiple project sources without cluttering up folders, especially for large
or relatively static source objects).

<P>When finished, tap on Newt's icon from Sloup (or open Extras and open
Newt from there).

<P>Newt automatically checks objects and methods in its current folder (you
may need to change folders, e.g., Test, for your current application. If
there are any Newt structure or NewtonScript syntax errors, these are
reported to both Newt's Eval Log and the desktop terminal emulator. For
syntax errors, Newt will provide the line of source referred to in the error
message.

<P>If you plan to edit locally, check the Inspect? box. This keeps the
serial connection open, but changes input modes (see Inspector). Fix any
syntax errors, either directly in Newt (you can use the Inspector for
keyboard input and to Save entries) [possibly, making changes in parallel in
your text editor], or if there are many changes to be made, you could make
the edits in the desktop editor, uncheck Inspect? and re-transfer the file
with Sloup.

<P>Build your application: "Build(App)" action command, or
<CODE>:doObj('build,'myApp)</CODE>.

<P>Start using/testing your app.

<P>If Inspect? is on, any Print expressions or errors will output to the
terminal emulator. Of course, if you are developing an application involving
serial or IR communication, you will have to Disconnect Sloup before
attempting to initialize a new protoEndPoint. (See inspterm.nwt example for
other debugging strategies).

<P>Continue editing, testing...

<P>Tap Save to save current running application as a package.

<P>To transfer the package to the desktop, see <A
HREF="../toolinfo.htm">tools page</A>: ExtractPackage and Newton Connection
Kit for 1.x; Package Buddy for 2.x; Sloup and NewtonLink for 2.x and Unix.

<P>If you have made many changes in your Newton and wish to keep a backup
copy on your desktop system, you can do a DUMP! and capture the current
folder as a log file. (Or, if you want to save the source on the Newton as a
library, see the Newt documentation for how to build a "folder library")

<H1><A NAME="Newt's Cape using Sloup">Newt's Cape using Sloup</A></H1>

<P>You can use Sloup to
<UL>
<LI>transfer HTML source to the Notepad
<LI>type (using desktop keyboard) into Notepad or Newtworks(2.1)
<LI>transfer bitmaps and PICTs created by Newt's Cape Graphic Converter to soups
<LI>transfer soup data (from forms) to desktop
</UL>

<P>You can also use Newt's Cape to transfer a Sloup-format file via TCP/IP
(if you have NIE installed on a 2.x Newton), and give it to Sloup for
processing. For example, <A
HREF="../newtscape/exs/helpslpi.htm">helpslpi.htm</A> provides an HTML form
that allows you to select some standard Sloup file extensions (.nwt, .bit,
...) and register these with Newt's Cape. When you access a URL for one of
these files, Sloup will receive the file via Newt's Cape. This helper app
stays in effect until you de-install via the page (or reboot). See addFile
API (next).

<P>You could also do this installation of extensions directly via a Sloup
spec, e.g.,

<PRE>Sloup
{dummy: GetRoot().|Newtscape:Newtscape|:installHelperApp(\
"text/plain", '|Sloup:TKnollSys|, {extensions: [".tab", ".nwt", ".slp"]})}	// install
</PRE>
<P>And to deinstall:
<PRE>Sloup
{dummy: GetRoot().|Newtscape:Newtscape|:installHelperApp(\
"text/plain", '|Sloup:TKnollSys|, NIL)}	// de-install
</PRE>

<P>Enter a URL into Newt's Cape and tap Open:Location. Two demo URLs you can
try (assumes you installed .tab and .nwt extensions):

<UL>
<LI>http://members.bellatlantic.net/~sweyer/newton/sloup/names20.tab (for Names)
<LI>http://members.bellatlantic.net/~sweyer/newton/newtdev/applic0.nwt (NewtDevEnv source for Notes)
</UL>

<H1><A NAME="addFile API">addFile API</A></H1>

<P>the :addFile API is compatible with Newt's Cape helperApp mechanism, but
Newt's Cape does not have to be installed for it to be accessed directly by
another application. addFile has the following 4 parameters:

<DL>
<DT>MIME type
<DD>usually "text/plain". ignored for now

<DT>file name
<DD>a string. ignored for now

<DT>file
<DD>lines of Sloup commands. be sure to quote any " with \

<DT>options
<DD>usually nil or {}. ignored for now
</DL>

<H1><A NAME="NTK Inspector using Sloup">NTK Inspector using Sloup</A></H1>

<P>Generally, you cannot use NTK Inspector and Sloup at the same time
since NTK Inspector is using the serial or ADSP port. However, if you do not
Connect Sloup, but access it via <A HREF="#addFile API">addFile API</A>,
you can send "small" Sloup files directly from the NTK Inspector window.

<P>DUMPed results are Printed. (This has advantage that if you use Inspector
and get Sloup errors, you can do a stack trace and help me track them
down!). For example,

<PRE>GetRoot().|Sloup:TKnollSys|:addFile("text/plain", "foo.slp",
"Notes
{labels: 'Personal}
DUMP!", nil)
</PRE>
<H1><A NAME="General Soup Description">
General Soup Description
</A></H1>

<P>Some additional "types" to simplify the documentation (though these are not Sloup types)

<DL>
<DT>rich
<DD>strings containing ink data (unrecognized chars) mixed with regular text

<DT>bounds
<DD>{left: int, top: int, right: int, bottom: int}

<DT>font
<DD>an integer or font frame
</DL>

<P>I need to look more closely at soups to determine exact types, especially
on strings. In 2.0, there are more options and Sloup may have to use the
application API for each soup to ensure that these are set correctly.

<P>In the abbreviated descriptions below (I hope I am consistent), I use the
following notation:

<UL>

<LI>[] surrounds the type of a value, e.g., [int]
<LI>() surrounds an optional slot, e.g., (label)
<LI>indenting is used for nesting frames, e.g., as slot value or member of an array
</UL>

<H2><A NAME="Common Slots: All Soups">Common Slots: All Soups</A></H2>
<P>All soups have several slots in common. In general, you should not try to set these slots. However, there might be situations where it might be useful to DUMP! these, or to use with REPLACE!

<DL>
<DT><A NAME="_uniqueID">_uniqueID</A>
<DD>[int] unique identifier for entry within the soup (caution: this would probably be different on a different store or on a different Newton)

<DT><A NAME="_modtime">_modtime</A>
<DD>[time] date and time that entry was last modified (not present for new entries?).
</DL>

<H1><A NAME="Notes: Structure">Notes: Structure</A></H1>

<DL>
<DT>viewStationery
<DD>[symbol] = 'paperroll

<DT>class [NOS 2.x only]
<DD>[symbol]
	<UL>
	<LI>'paperroll (Note)
	<LI>'list (outline)
	<LI>'checkList (checklist)
	</UL>

<DT>height
<DD>[int] height (in pixels) of the note

<DT>data
<DD>[nil] for list or checkList; [array] frames containing text objects, polygons or ink objects
<P><B>text object</B>:
	<DL>
	<DT>viewStationery
	<DD>[symbol] = 'para
	<DT>viewBounds
	<DD>[bounds] the bounds of the text object
	<DT>text
	<DD>[string] text contained in the paragraph
	<DT>(tabs)
	<DD>[array] tab stops [int]
	<DT>(styles)
	<DD>[array] alternating lengths [int] and font [font] run-codes
	<DT>(viewFont)
	<DD>[font] -- defaults to current setting in Style palette
	</DL>
<P><B>polygon object</B>:
	<DL>
	<DT>viewStationery
	<DD>[symbol] = 'poly
	<DT>viewBounds
	<DD>[bounds] the bounds of the polygon object
	<DT>points
	<DD>[binary] binary data structure containing polygon data***
	</DL>
<P><B>ink object</B>:
	<DL>
	<DT>ink
	<DD>[binary] ink data
	<DT>viewBounds
	<DD>[bounds] the bounds of the ink object
	</DL>

<DT>topics [NOS 2.x list or checkList only]
<DD>[array] of topic frames (note: data = nil)
	<DL>
	<DT>text
	<DD>[string]
	<DT>styles
	<DD>[array] alternating lengths [int] and font [font] run-codes
	<DT>hideCount
	<DD>[int] how many items are hidden at level 'level'
	<DT>viewBounds
	<DD>[bounds]
	<DT>mtgDone (checkList only)
	<DD>[boolean] true if the check box is checked; nil if it is unchecked
	<DT>level
	<DD>[int] indent level (starting at 1)
	</DL>
<DT>timestamp
<DD>[time] creation date and time

<DT>(labels)
<DD>[symbol] file folder -- defaults to nil (Unfiled)
</DL>

<P>Sloup currently recognizes just labels, height, and viewFont, and
creates a single para object.

<H1><A NAME="Names: Import Examples">Names: Import Examples</A></H1>

<P>In addition to CasioNam.tab and Names20.tab, here are several Names
examples, followed by documentation on Names fields.Note use of line
continuations to make entryspec and data more readable. There are 19
top-level fields in this example -- you can have only 20 before ordering is
lost. Other possible fields to add: addresses[array], companies[array],
emailAddresses[array]; you can add more specific-type info on things like
email addresses, e.g., string.email.internet. One way to learn by example is
to modify the very first soup entry (check StewPot on Internal Names -- it's
probably Royce Walthrop); add the kind of info that you'd like your entries
to have; do a DUMP! on Names and look at the entrySpec info printed out --
match up spec and first entry.

<PRE><A HREF="names1.slp">Names
{labels: 'symbol,\
name: {class: 'person, honorific: "string", first: "string", last: "string", },\
title: "string", company: "string",\
address: "string", address2: "string", city: "string",\
	region: "string", country: "string", postal_code: "string",\
phones: ["homePhone", "workPhone", "mobilePhone", "faxPhone"],\
pagers: [{pagerNum: "string.pager", pagerPin: "string"}, ],\
email: "string.email", anniversary: "date", bday: "date",\
names: [{honorific: "string", first: "string", last: "string", title: "string",}],\
notes: ["para"], cardType: 0, sortOn: "stringWithClass"}

Business	person	Dr.	Royce	Walthroop	\
Grand VIP	Amalgamated Consolidated	\
217 Crocker Lane		Hillsdale	OH		44704	\
(419)555-3543	(419)555-3544	(419)555-3545	(419)555-3546	\
(123)456-7890	6666	foo@bar.com	8/25/76	12/12/46	\
Ms.	Grace	Mertins	Relative	\
hi, this is a note	0	name

BYE!</A>
</PRE>

<P>The following example leaves out some of the other fields, but adds a second address:

<PRE><A HREF="names2.slp">Names
{labels: 'symbol,\
name: {class: 'person, last: "string", first: "string", },\
address: "string", address2: "string", city: "string",\
	region: "string", postal_code: "string",\
company: "string",\
addresses: [{\
	address: "string", address2: "string", city: "string",\
	region: "string", postal_code: "string", }],\
phones: ["homePhone", "mobilePhone", "workPhone", "faxPhone"],\
cardType: 0, sortOn: "stringWithClass"}

Business	person	Walthump	Royce	\
227 Clunker Lane		Hallsdale	OH	44704	\
Amalgamated Unlimited	\
217 Clacker St.		Hellsdale	OH	44704	\
(419)555-3543	(419)555-3544	(419)555-3545	(419)555-3546	\
0	name
Business	person	Walthrip	Royce	\
217 Crisper Ave.	Apt. 3B	Hollsdale	OH	44704	\
Aggregated Mergers	\
217 Crimper Lane		Hullsdale	OH	44704	\
(419)555-3543	(419)555-3544	(419)555-3545	(419)555-3546	\
0	name

BYE!</A>
</PRE>

<H1><A NAME="Names: Structure">Names: Structure</A></H1>

<P>The following slots are common to all Names objects. Each class may have
additional slots.

<H2><A NAME="Common Slots: Names">Common Slots: Names</A></H2>

<DL>
<DT>cardType
<DD>[int] 0 (Squiggle), 1 (Plain), 2 (Separate), 3 (Cross)

<DT>class (NOS 2.x)
<DD>[symbol]: 'person, 'company, 'owner, 'worksite, 'group

<DT>sortOn
<DD>[string] same as contents of slot:
	<UL>
	<LI>name.last (Person)
	<LI>company (Company)
	<LI>name.last (Owner) (NOS 2.x)
	<LI>place (Worksite) (NOS 2.x)
	<LI>group (Group) (NOS 2.x)
	</UL>

<DT>(labels)
<DD>[symbol]

<DT>(notes)
<DD>[array, string, nil] card note frames (see Notes.data), text string or nil (to clear notes). 
</DL>

<P>There are additional slots depending on the class. For 1.x, the slots are
for Person, and the "class" could be inferred from context (whether name or
company is optional).

<H2>Person</H2>

<DL>
<DT>name (required if no company for 1.x)
<DD>[frame]
	<DL>
	<DT>class??
	<DD>'person
	<DT>first
	<DD>[string (rich)] person's first name
	<DT>last
	<DD>[string: 'Name] person's last name
	<DT>honorific
	<DD>[string (rich)] Mr., Ms., Dr., etc.
	<DT>title
	<DD>[string (rich)] person's title
	</DL>
<DT>(names) (NOS 2.x only)
<DD>[array] affiliated names (company contacts, family members, etc.) [frame: 'Person]. title refers to relationship to the main name. 

<DT>company (required if no name for 1.x)
<DD>[string: 'Company]  [string (rich)] for NOS 2.x

<DT>(companies) (NOS 2.x only)
<DD>[array] of frames
	<DL>
	<DT>company
	<DD>[string]
	<DT>title
	<DD>[string]
	</DL>

<DT>(address)
<DD>[string (rich)] street address

<DT>(address2)
<DD>[string (rich)] 2nd line of address

<DT>(city)
<DD>[string]

<DT>(region)
<DD>[string] state or province

<DT>(postal_code)
<DD>[string] postal or zip code

<DT>(country)
<DD>[string]

<DT>phones
<DD>[array] up to four(?) phone numbers [string: 'phone, 'homePhone, 'faxPhone, 'workPhone, 'carPhone, 'mobilePhone, 'homeFaxPhone, 'otherPhone, ]

<DT>(bday)
<DD>[date] birthday

<DT>(email)
<DD>[string.email] e-mail address. If address is of specific type, use one
of the following classes: string.email.aol, string.email.compuserve,
string.email.mcimail, string.email.attmail, string.email.easylink,
string.email.prodigy, string.email.genie, string.email.delphi,
string.email.interchange, string.email.msn, string.email.radiomail. For more
than 1 address, see emailAddrs.
</DL>

<H2>Person [NOS 2.x]</H2>

<P>Additional slots for 2.x only

<DL>
<DT>addresses
<DD>[array] additional addresses [frame]: address, address2, city, region,
country, postal_code

<DT>emailAddrs
<DD>[array] additional e-mail addresses [frame]
	<DL>
	<DT>email
	<DD>[string.email] -- see more specific classes under email slot
	<DT>emailPassword
	<DD>[string] only for cards of type 'owner only
	</DL>

<DT>emailPassword
<DD>[string] owner's e-mail password (only for cards of type 'owner only).
This goes with top-level email slot

<DT>pagers
<DD>[array] pager information frames
	<DL>
	<DT>pagerNum
	<DD>[string.pager] pager number
	<DT>pagerPIN
	<DD>[string] pager PIN
	</DL>

<DT>bdayEvent
<DD>[alias] to a calendar meeting

<DT>anniversary
<DD>[date] anniversary date

<DT>anniversaryEvent
<DD>[alias] to a calendar meeting
</DL>

<H2>Company (NOS 2.x)</H2>

<P>Very similar to Person

<DL>
<DT>name
<DD>[nameRef] (same as Person)

<DT>company
<DD>[string] (same as Person)

<DT>names
<DD>[array] of [nameRefs]. in addition, a nameRef can contain
	<DL>
	<DT>affiliation
	<DD>[string (rich)] company affiliation
	</DL>

<DT>address
<DT>address2
<DT>city
<DT>region
<DT>postal_code
<DT>country
<DT>phones
<DT>email
<DT>emailAddrs (NOS 2.x)
</DL>

<H2>Owner (NOS 2.x)</H2>

<P>Same as Person, but in addition:
<DL>
<DT>owner
<DD>[frame]
	<DL>
	<DT>spareTime
	<DD>[string]
	<DT>bankAccounts
	<DD>[array] frames
		<DL>
		<DT>bankAcctNum
		<DD>[string] the account number
		<DT>bankContactNum
		<DD>[phone] phone number string for the bank account contact
		</DL>
	<DT>creditCards
	<DD>[array] frames
		<DL>
		<DT>creditCardName
		<DD>[string] credit card user's name
		<DT>creditCardNum
		<DD>[string] the account number
		<DT>creditCardExpDate
		<DD>[string] the expiration date
		<DT>creditCardContactNum
		<DD>[phone] phone number string for the credit card account contact
		<DT>signature
		<DD>[signature] text and ink that user entered on signature slip
		</DL>
	</DL>
</DL>

<H2>Worksite (NOS 2.x)</H2>

<DL>
<DT>place
<DD>[string] the place name

<DT>dialingPrefix
<DD>[string] dialing prefix needed to get an outside line from this worksite

<DT>areaCode
<DD>[string] area code of this worksite

<DT>printer
<DD>[string] the printer the user has chosen from among network printers

<DT>mailAccess
<DD>[array] of frames
	<DL>
	<DT>mailPhone
	<DD>[string]
	<DT>mailNetwork
	<DD>[symbol] e.g., 'concert
	<DT>baud
	<DD>[int] e.g., 1200
	</DL>

<DT>connectionPhone
<DD>[phone] phone number string to access e-mail at this site

<DT>connectionNetwork
<DD>[string] the network zone and machine name. The parameters are currentSelection, which returns the selected entity and currentZone, which returns the currently selected AppleTalk zone

<DT>cityAlias
<DD>[alias] to the closest city entry in the worldData soup

<DT>countrySymbol
<DD>[symbol] representing the country

<DT>country
<DD>[string] representing the country

<DT>notes
<DD>[array, string, nil]

<DT>sorton
<DD>[string]
</DL>

<H2>Group (NOS 2.x)</H2>

<DL>
<DT>group
<DD>[string] group's name

<DT>members
<DD>[array] of [nameref] representing the members of the group
</DL>


<H1><A NAME="Calendar: Dump Example (2.x)">Calendar: Dump Example (2.x)</A></H1>

<PRE><A HREF="calendr1.slp">Calendar
{viewStationery: 'Meeting, mtgStartDate: "time", mtgDuration: "int",\
mtgText: "rich", mtgStopDate: "time", repeatType: "int", mtgInfo: "int",\
mtgAlarm: "time", mtgIconType: "int",\
mtgInvitees: [{name: {first: "string", last: "string"},}], version: "int",}
DUMP!</A>
</PRE>
<H1><A NAME="To Do: Dump Example (2.x)">
To Do: Dump Example (2.x)
</A></H1>
<PRE><A HREF="todo1.slp">To Do List
{class: 'todo, Date: "time", repeatInfo: {mtgStartDate: "time",\
mtgStopDate: "time", repeatType: "int", mtgInfo: "int",},\
topics: [{level: "int", mtgDone: "boolean", mtgPriority: "int",\
hideCount: "int", text: "string"}],}
DUMP!</A>
</PRE>

<HR>
<P>Version 2.1. Last updated: Jan 1998

<UL>
<LI><A HREF="#Keyboard, Print: Sloup Inspector">Top</A>
<LI><A HREF="slrptoc.htm">Table of Contents</A>
<LI>Index: <A HREF="slrpindx.htm#A">A</A> | <A HREF="slrpindx.htm#B">B</A> | <A HREF="slrpindx.htm#C">C</A> | <A HREF="slrpindx.htm#D">D</A> | <A HREF="slrpindx.htm#E">E</A> | <A HREF="slrpindx.htm#F">F</A> | <A HREF="slrpindx.htm#G">G</A> | <A HREF="slrpindx.htm#H">H</A> | <A HREF="slrpindx.htm#I">I</A> | <A HREF="slrpindx.htm#J">J</A> | <A HREF="slrpindx.htm#K">K</A> | <A HREF="slrpindx.htm#L">L</A> | <A HREF="slrpindx.htm#M">M</A> | <A HREF="slrpindx.htm#N">N</A> | <A HREF="slrpindx.htm#O">O</A> | <A HREF="slrpindx.htm#P">P</A> | <A HREF="slrpindx.htm#Q">Q</A> | <A HREF="slrpindx.htm#R">R</A> | <A HREF="slrpindx.htm#S">S</A> | <A HREF="slrpindx.htm#T">T</A> | <A HREF="slrpindx.htm#U">U</A> | <A HREF="slrpindx.htm#V">V</A> | <A HREF="slrpindx.htm#W">W</A> | <A HREF="slrpindx.htm#X">X</A> | <A HREF="slrpindx.htm#Y">Y</A> | <A HREF="slrpindx.htm#Z">Z</A>
<LI><A HREF="mailto:weyer@kagi.com">weyer@kagi.com</A>
<LI><A HREF="../index.htm">Steve's releases page</A>
</UL>
</BODY>
</HTML>
